package com.hdd.hll.common.utils;

import com.alibaba.fastjson.JSONObject;
import com.hdd.hll.common.config.Global;

import java.util.*;

public class SignUtils {

    private static String Key = Global.getConfig("hdd.key");

    public static void main(String[] args) {
        SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
        parameters.put("url", "http://127.0.0.1:9088/pound/findPounds");
        parameters.put("dataSize", 100);
        parameters.put("maxWid", 0);
        String mySign = createSign(parameters);
        System.out.println("我     的签名是："+mySign);

    }


    /**
     * 将JSONObject转换成升序Map
     * @explain 将参数按照第一个字符的键值 ASCII 码递增排序（字母升序排序），如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序，
     *          以此类推通过SortedMap可以实现
     * @param jsonObject
     * @return SortedMap 按ASCII码升序排列
     */
    public static SortedMap<Object, Object> toSortedMap(JSONObject jsonObject) {
        // 用于存储接收到的key:value，并按key以ASCII码进行升序排列组合
        SortedMap<Object, Object> data = new TreeMap<>();
        // 获取json对象中的键
        Set<String> keySet = jsonObject.keySet();
        Object key = "";
        Object value = null;
        // 遍历json数据，添加到SortedMap对象
        for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) {
            key = iterator.next();
            value = jsonObject.get(key);
            data.put(key, value);
        }
        return data;
    }



    public static String createSign(SortedMap<Object,Object> parameters){
        StringBuffer sb = new StringBuffer();
        Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序（升序）
        Iterator it = es.iterator();
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            Object v = entry.getValue();
            if(null != v && !"".equals(v)
                    && !"sign".equals(k) && !"key".equals(k)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + Key);
        String sign = MD5Util.MD5Encode(sb.toString(), "UTF-8").toUpperCase();
        System.out.println(sign);
        return sign;
    }
}
